package com.gitee.cui.netty.decoder;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ReplayingDecoder;

import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * 字符串解析器，分成两段进行解析，第一段解析字符串的长度，第二段根据第一段解析出的字符串长度，解析出正确的字符串内容
 * @author cuiqingqiang
 * @version 1.0
 * @date 2021/10/22 20:38
 **/
public class StringReplayDecoder extends ReplayingDecoder<StringReplayDecoder.PHASE> {

    private int length;

    private byte[] array;

    public StringReplayDecoder() {
        super(PHASE.PHASE_1);
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        switch (state()) {
            case PHASE_1:
                // 解析字符串长度
                length = in.readInt();
                array = new byte[length];
                checkpoint(PHASE.PHASE_2);
                break;
            case PHASE_2:
                // 根据解析出的字符串长度，解析出字符串内容
                in.readBytes(array, 0, length);
                out.add(new String(array, StandardCharsets.UTF_8));
                checkpoint(PHASE.PHASE_1);
                break;
            default:
                break;
        }
    }

    enum PHASE {
        /**
         * 第一段，解析出字符串的长度
         */
        PHASE_1,

        /**
         * 第二段，根据第一段解析出的字符串长度，解析第二段字符串内容
         */
        PHASE_2;
    }
}
